引言
本文不是一个完整的配置指南,而是在一个完整配置的基础上进行优化或者实现一些特殊需求的内容,不是一个完整的配置参考,但能给出参考入口,同时也能将文档没写清楚的内容做一下详细解释。
基本配置
optimization
文档参考–
webpack本身会自动对代码块进行分割,条件规则如下
- 新的可共享的块或者从
node_modules里面来的模块 - 新的大约
30KB(压缩前大小)的块 - 按需加载最大并行请求数量要求不超过5个
 - 初始页面最大并行请求数量要求不超过3个
 
- 新的可共享的块或者从
 默认值如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26module.exports = {
//...
optimization: {
splitChunks: {
chunks: 'async',
minSize: 30000,
maxSize: 0, // 优先级 maxInitialRequest/maxAsyncRequests < maxSize < minSize
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
};optimization.runtimeChunk可选值true和multiple,还有 single 参考true和multiple是一个意思,- 这里需要注意下,在配置
html-webpack-plugin的时候,需要配置runtime-${entry}或者是runtime 
optimization.splitChunks.chunks制定需要优化的代码块all同步和异步模块都进行打包优化,在所有块中共享块async只针对异步模块进行打包优化,在异步块中共享块initial只针对同步块进行打包优化,在同步块中共享块- Function ,
 
optimization.splitChunks.cacheGroups作为代码块分组的内容,作用替代CommonsChunkPlugin,test、priority、reuseExistingChunk只能在cacheGroups下面每个group中设置多页打包,提取公共内容
1
2
3
4
5
6
7cacheGroups: {
commons: {
name: 'commons',
chunks: 'initial',
minChunks: 2
}
}node_modules下面的内容单独打包1
2
3
4
5
6
7cacheGroups: {
commons: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all'
}
}
注意事项
- 默认会有
vendors-${entry}这个注入块 vendors-${entry}在配置了多个cacheGroups的情况下,不一定会出这个注入块(有优先级、size、minChunks等条件的约束)- 配置成
html-webpack-pluginchunks的时候需要注意这个问题 
- 默认会有
 待解决 default 控制了什么内容
webpack-dev-server
增加一个API Mock 中间件的配置,插件源码参考, 放
setup,before配置里面都可以1
2
3
4
5
6
7
8
9
10
11
12module.exports = {
//...
devServer: {
setup: function(app, server) {
if (config.dev.withMock) {
app.use(mockPlugin({
mockConf: './mock/mock-conf.js'
}))
}
}
}
};host配置为0.0.0.0可以支持外部访问,比如用IP地址来访问historyApiFallback配置history模式下的路由解析1
2
3
4
5historyApiFallback: {
rewrites: [
{from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html')},
],
},hotwebapck-dev-server内置了热更新,只需要配置hot=true即可,使用webpack-dev-middleware的话还需要单独配置热更新的内容https配置启用https,可以使用webpack-dev-server内置的证书,也可以自己提供证书overlay报错直接在页面上显示1
2
3
4
5
6
7
8
9module.exports = {
//...
devServer: {
overlay: {
warnings: true,
errors: true
}
}
};
html-webpack-plugin 打包js注入模板
- 文档参考
 - 默认可以解析 lodash templates, 常用的如下:
- 使用 
<%= variable %>或者<% ${variable} %>来展示变量值 - 使用
<%- variable %>来对变量值进行HTML转义 - 使用 
<% //js code %>来嵌入JavaScript代码 
 - 使用 
 - 问题1,使用chunks 设置内容的时候,同样的配置在
npm run dev下,会多出来一个vendors-${entry}的注入项,如果chunks中没设置,会导致页面无法渲染,没有报错- 原因:默认有vendors组,会将node_modules 里面的自动打包,并且根据根据entry命名 
vendors-${entry}类似于runtime - 解决:直接不设置chunks,使用自动的配置;或者禁用vendors 组(设置cacheGroups.vendors:false),
 
 - 原因:默认有vendors组,会将node_modules 里面的自动打包,并且根据根据entry命名 
 
web-webpack-plugin 针对多页打包有优化
script-ext-html-webpack-plugin 增强的html-webpack-plugin 更多精细控制
优化
分析工具
打包时间衡量 speed-measure-webpack-plugin
打包模块依赖查看 [webpack-bundle-analyzer]
命令行看板 webpack-dashboard
增强版打包看板 jarvis
性能优化
启用babel-loader cacheDirectory
增加happypack(再Webpack4中启用babel-loader Cache后引入几乎无改善)
- 修改
webpack.base.conf.js将babel-loader缓存happypack-loader 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
test: /\.js$/,
// loader: 'babel-loader?cacheDirectory',
loader:'happypack/loader?id=babelloader',
// use: [{
// loader:'happypack/loader',
// options:{
// id:'babelloader'
// }
// }],
}
// 增加对vue-loader的配置
Object.assign(vueLoaderConfig.loaders, {
js: 'happypack/loader?id=babelloader',
})- 修改
webpack.prod.conf.js增加babel-loader插件配置 
1
2
3
4new HappyPack({
id:'babelloader',
loaders:['babel-loader?cacheDirectory']
}),- 异常解决 
Error: options/query provided without loader (use loader + options) in 
将上面的改动use的写法,改成loader的写法
- 修改
 dll打包的方式,优化效果也不明显,使用
optimization.splitChunks.cacheGroups来优化浏览器长期缓存
参考资料
- 加快Vue项目的开发速度
 - Vue项目Webpack优化实践,构建效率提高50%
 - Webpack4优化之路
 - 从实践中寻找webpack4最优配置
 - 手摸手,带你用合理的姿势使用webpack4(下)
 - webpack SplitChunksPlugin实用指南
 - Webpack 4 配置最佳实践
 - Webpack 4 配置最佳实践
 - Webpack 打包优化之速度篇 vue-loader-happypack
 - 使用happypack将vuejs项目webpack初始化构建速度提升50%
 - React 16 加载性能优化指南
 - webpack4之splitChunks拆拆拆
 - 一步一步的了解webpack4的splitChunk插件
 - 趁webpack5还没出,先升级成webpack4吧
 - webpack4.0各个击破(4)—— Javascript & splitChunk
 - Webpack4之SplitChunksPlugin规则
 - Webpack4学习笔记(三)——代码分割(多入口)
 - WebpackOptions.json
 - 手摸手,带你用合理的姿势使用webpack4(上)
 - 手摸手,带你用合理的姿势使用webpack4(上)
 - 高性能webpack配置
 - chunks 详解-Webpack 4 — Mysterious SplitChunks Plugin
 - Webpack 4 Course Code Spliting with SplitChunksPlugin
 - webpack 4: 模式(mode)和优化项(optimization)说明
 
最后更新: 2022年03月02日 03:32
原始链接: http://rawbin-.github.io/dev-tools/webpack/2017-11-03-advanced-webpack-config/